home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / gp / join.c < prev    next >
C/C++ Source or Header  |  1991-12-16  |  4KB  |  199 lines

  1. #include "7plus.h"
  2. #include "globals.h"
  3.  
  4. /*
  5. *** control joining of err-files
  6. ***
  7. ***
  8.  */
  9. int join_control (char *file1, char *file2)
  10. {
  11.   char *q, errnam[MAXPATH], dummi[20];
  12.   int  errn;
  13.  
  14.   if (file1 && file2)
  15.     return (join_err (file1, file2));
  16.  
  17.   if (!file1)
  18.   {
  19.     printf ("\007No error report specified.\nBreak.\n");
  20.     return (12);
  21.   }
  22.  
  23.   strcpy (errnam, file1);
  24.  
  25.   errn = 1;
  26.   do
  27.   {
  28.     if ((q = strrchr (errnam, '.')) != NULL)
  29.       *q = EOS;
  30.     sprintf (dummi, ".e%02x", errn++);
  31.     strcat (errnam, dummi);
  32.     if (test_exist (errnam) || join_err (file1, errnam))
  33.       break;
  34.   }
  35.   while (!test_exist (errnam));
  36.   return (0);
  37. }
  38.  
  39.  
  40.  
  41. /*
  42. *** join error reports. This is useful when many different error reports
  43. *** were received. if the sum of missing lines in the reports isn't too big,
  44. *** it may be practical to upload a correction file that covers lines from
  45. *** more than a single error report.
  46.  */
  47.  
  48. int join_err (char *file1, char *file2)
  49. {
  50.   FILE *_file[2], *tmp;
  51.   char *p[2], *file[2], line[2][81];
  52.   char name[2][80], fullname [2][31];
  53.   char ltab[512], dummi[20];
  54.   char *err_rprt = "7PLUS error report:";
  55.   char *scan     = "%12s %s /%30[^/]/ %ld";
  56.   char *scan2    = "%12s %s %ld";
  57.   char *inv_err  = "\007Invalid error report: '%s'\n";
  58.   int  blocksize[2], part[2], _part;
  59.   int  i, j, k;
  60.   long fsize[2];
  61.  
  62.   file[0] = strdup (file1);
  63.   file[1] = strdup (file2);
  64.  
  65.   for (i=0;i<2;i++)
  66.   {
  67.     *name[i] = *fullname[i] = EOS;
  68.     blocksize[i] = part[i] = 0;
  69.     fsize[i] = 0L;
  70.     p[i] = NULL;
  71.  
  72.     if (crc_file (file[i], err_rprt, "00\n", 1) == 1)
  73.       return (7);
  74.  
  75.     _file[i] = fopen (file[i], OPEN_READ_TEXT);
  76.  
  77.     while ((p[i] = my_fgets (line[i], 80, _file[i])) != NULL)
  78.       if (!strncmp (line[i], err_rprt, 19))
  79.         break;
  80.  
  81.     if (!p[i])
  82.     {
  83.       printf (inv_err, file[i]);
  84.       return(7);
  85.     }
  86.     sscanf (&line[i][20], scan, name[i], dummi, fullname[i], &fsize[i]);
  87.     blocksize[i] = get_hex (dummi);
  88.     if (!*fullname[i])
  89.     {
  90.       fsize[i] = 0L;
  91.       sscanf (&line[i][20], scan2, name[i], dummi, &fsize[i]);
  92.     }
  93.   }
  94.   if (strcmp (name[0], name[1]) || (blocksize[0] != blocksize[1]) ||
  95.        ((fsize[0] && fsize[1]) && (fsize[0] != fsize[1])))
  96.   {
  97.     printf ("\007The two error reports do not relate to the same original file!\n");
  98.     printf ("Break.\n");
  99.     return (13);
  100.   }
  101.  
  102.   if (!fsize[0])
  103.     fsize[0] = fsize[1];
  104.  
  105.   if (!fsize[1])
  106.     fsize[1] = fsize[0];
  107.  
  108.   if (!*fullname[0])
  109.     strcpy (fullname[0], fullname[1]);
  110.  
  111.   if (!*fullname[1])
  112.     strcpy (fullname[1], fullname[0]);
  113.  
  114.   if ((tmp = fopen (tmpfil, OPEN_WRITE_TEXT)) == NULL)
  115.   {
  116.     printf ("\007Can't write new error report.\nBreak.\n");
  117.     return (1);
  118.   }
  119.   fprintf (tmp, "7PLUS error report: %s %03X", name[0], blocksize[0]);
  120.   if (*fullname[0])
  121.     fprintf (tmp, " /%s/", fullname[0]);
  122.   if (fsize[0])
  123.     fprintf (tmp, " %ld", fsize[0]);
  124.   fprintf (tmp, delimit);
  125.  
  126.   part[0] = part[1] = 0;
  127.   for (_part=1;_part<256;_part++)
  128.   {
  129.     for (i=0;i<2;i++)
  130.     {
  131.       if (part[i] < _part && part[i] != -1)
  132.       {
  133.         p[i] = my_fgets (line[i], 80, _file[i]);
  134.         part[i] = get_hex (line[i]);
  135.       }
  136.       if (!part[i])
  137.         part[i] = -1;
  138.     }
  139.  
  140.     if (part[0] == -1 && part[1] == -1)
  141.       break;
  142.  
  143.     for (i=0;i<512;i++)
  144.       ltab[i] = 0;
  145.     for (i=0;i<2;i++)
  146.     {
  147.       if (part[i] == _part)
  148.       {
  149.         j = 0;
  150.         while (j != 0xfff)
  151.         {
  152.           fscanf (_file[i], "%s", line[0]);
  153.           j = get_hex (line[0]);
  154.           if (j != 0xfff)
  155.             ltab[j] = 1;
  156.           else
  157.             break;
  158.         }
  159.         if (j == 0xfff)
  160.           continue;
  161.       }
  162.     }
  163.     for (i=k=0;i<512;i++)
  164.       k += ltab[i];
  165.     if (k)
  166.     {
  167.       fprintf (tmp, "%02X%s", _part, delimit);
  168.       k = 18;
  169.       for (i=0;i<512;i++)
  170.       {
  171.         if (ltab[i])
  172.         {
  173.           fprintf (tmp, "%03X ", i);
  174.           k--;
  175.         }
  176.         if (!k)
  177.         {
  178.           fprintf (tmp, delimit);
  179.           k = 18;
  180.         }
  181.       }
  182.       fprintf (tmp, "FFF%s", delimit);
  183.     }
  184.   }
  185.   fprintf (tmp, "00%s", delimit);
  186.  
  187.   fclose (_file[0]);
  188.   fclose (_file[1]);
  189.   fclose (tmp);
  190.   unlink (file[0]);
  191.   rename (tmpfil, file[0]);
  192.  
  193.   crc_file (file[0], "7P",  "00\n", 0);
  194.  
  195.   printf ("'%s' has been joined to '%s'.\n", file[1], file[0]);
  196.  
  197.   return(0);
  198. }
  199.